import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
// 导入封装好的api接口的文件
import { login, getUserInfo, getUserDetailById } from '@/api/user'
import { resetRouter } from '@/router'
// 放置状态
const state = {
  // 每次初始化vuex时候从缓存中读取token
  token: getToken(),
  userInfo: {} // 设置token为共享状态
}
const mutations = {
  // 设置token
  setToken(state, token) {
    state.token = token
    // vuex和缓存数据同步
    setToken(token)
  },
  removeToken(state) {
    state.token = null
    removeToken()
  },
  // 修改userinfo
  setUserInfo(state, result) {
    state.userInfo = result
    // console.log(state, 455)
  },
  // 删除userinfo
  removeUserInfo(state) {
    state.userInfo = {}
  }
}
// 封装登陆的action
// 登陆action时候要调用登陆接口，成功后设置token到vuex，失败返回失败
const actions = {
  // 定义login action 也需要参数，调用action时，传递过来的参数
  async login(context, data) {
    // login实现了promise对象，await等待，result就是结果
    const result = await login(data) // 拿到token
    context.commit('setToken', result) // 结构token
    // 拿到token。说明登陆成功了
    setTimeStamp() // 设置当前的时间戳
  },
  async getUserInfo(context) {
    // result 是用户的基本资料数据
    const result = await getUserInfo()
    // 获取用户的详情接口方法执行
    //  baseInfo获取用户的详情数据
    const baseInfo = await getUserDetailById(result.userId)
    // console.log(baseInfo)
    // console.log(baseInfo)
    // 把两次获取的结果进行合并传递过去
    // console.log(result)
    // console.log(baseInfo.then())
    const obj = { ...result, ...baseInfo }
    console.log(obj, '用户基本数据和详情数据')
    context.commit('setUserInfo', obj)
    return result // 这里为了以后权限分配做处理
  },
  // 退出操作
  logout(context) {
    // 删除token 删除了vuex中的还删除了缓存中的数据
    context.commit('removeToken')
    // 删除用户资料
    context.commit('removeUserInfo')
    // 重置路由
    resetRouter()
    // 把permission也清空，只剩下静态路由
    // 子模块调用带有命名空间的另一个子模块
    // vuex子模块调用子模块下的action，没加锁任意调用
    // 不加命名空间下，所有mutation和action都是挂载全局上的，可以直接嗲用
    // mutation名称 载荷  payload  第三个参数 {root:true} 调用根级的mutation或者action
    context.commit('permission/setRoutes', [], { root: true })
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
